package scalahighlevel

/**
  * scala的泛型
  *
  *  3、上界和下界：规定泛型的取值范围
        举例：
        （1） 普通数据类型
                 int x 范围
                   100 <= x  <= 200
                   下界         上界
        （2）规定：泛型的取值范围
                   继承关系
                      A ---> B ---> C ---> D
                      D <:  y泛型 <: B  ====> 表示：y的类型只能是：B  C  D
        概念
           上界：定义 S <: T，表示S的类型必须是T的子类
           下界：定义 U >: T  表示U的类型必须是T的父类

   4、视图界定：是上界和下界的一个扩展
        概念：适用范围更广泛
              以上界为例  <:

              接收除了所有的子类，还允许接收隐式转换过去的类型
              定义：<%
        看个例子: 定义一个函数完成两个字符串的拼加
        def addTwoString[T <: String](x:T,y:T) = {println(x+"****"+y)}
        调用：addTwoString("Hello","World")

        再调用一次: addTwoString(100,200)  ====> 100*****200
                    100 ---> "100"
                    200 ---> "200"

        使用视图界定重新来定义
           def addTwoString[T <% String](x:T,y:T) = {println(x+"****"+y)}
            表示T的类型：
            （1）String和String的子类
            （2）还可以是可以转换成String的类型

            重新调用：addTwoString(100,200)
                    错误：error: No implicit view available from Int => String.

        视图界定的时候：一定有一个转换规则(隐式转换函数)
            implicit def int2String(n:Int):String = {n.toString}

            addTwoString(100,200)
        执行过程: (1) 调用隐式转换函数int2String:  int ====> String
                        100 ---> "100"
                        200 ---> "200"
                  (2) 再调用addTwoString



  */
//父类: 代表所有的交通工具
class Vehicle {
  def drive()={print("drive")}
}
//定义两个子类
class Car extends Vehicle{
  override def drive(): Unit = {println("car drive")}
}

class Bike extends Vehicle{
  override def drive(): Unit = {println("bike drive")}
}
class Apple{}

object ScalaUpperBound {
  //定义一个泛型函数
  def takeVehicle[T <: Vehicle](v:T) = {v.drive()}

  def main(args: Array[String]): Unit = {
    //定义一个交通工具
    var v1:Vehicle = new Vehicle
    takeVehicle(v1)

    var v2:Car = new Car
    takeVehicle(v2)

    //能否使用Apple:不能使用
//    var v3:Apple =new Apple
//    takeVehicle(v3)
  }
}





















